package com.cy.pj.sys.service.impl;

import com.cy.pj.common.annotation.RequiredLog;
import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.common.pojo.PageObject;
import com.cy.pj.sys.dao.SysLogDao;
import com.cy.pj.sys.pojo.SysLog;
import com.cy.pj.sys.service.SysLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Slf4j
@Service
public  class SysLogServiceImpl implements SysLogService {
    @Autowired
    private SysLogDao sysLogDao;

    @Async //此注解描述的方法为一个异步切入点方法，此方法在执行时会运行在一个独立的线程中
    @Transactional//默认为Propagation.REQUIRED
    //@Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void saveObject(SysLog entity) {//此方法永远工作的一个独立的事务中
        String tName=Thread.currentThread().getName();
        System.out.println("SysLogServiceImpl.saveObject->thread.name->"+tName);
        try{Thread.sleep(5000);}catch (Exception e){}//模拟耗时操作
        sysLogDao.insertObject(entity);
    }
    //@RequiresPermissions注解描述的方法为一个权限切入点方法，当登录用户访问此方法时需要授权。
    //那如何检测用户是否有访问此方法的权限？
    //第一：获取访问此方法时需要的权限标识:"sys:log:delete"
    //第二：获取登录用户拥有的菜单权限标识？(user->role->menu->permission)
    //第三：判定用户拥有的权限标识中是否包含访问方法时需要的授权标识，假如包含则授权访问。
    @RequiresPermissions("sys:log:delete")
    @RequiredLog("日志删除")
    @Override
    public int deleteObjects(Integer... ids) {
        //1.参数校验
        if(ids==null||ids.length==0)
            throw new IllegalArgumentException("必须提供正确的id值");
        //2.基于id删除日志
        int rows=sysLogDao.deleteObjects(ids);
        //3.校验结果并返回
        if(rows==0)
            throw new ServiceException("记录可能已经不存在");
        return rows;
    }

    @RequiredLog("日志查询")
    @Override
    public PageObject<SysLog> findPageObjects(String username, Integer pageCurrent) {
        String tName=Thread.currentThread().getName();
        System.out.println("SysLogServiceImpl.findPageObjects->thread.name->"+tName);
        //long t1=System.currentTimeMillis();
        //1.参数校验
        if(pageCurrent==null||pageCurrent<1)throw new IllegalArgumentException("当前页码值不正确");
        //2.查询总记录数并校验
        int rowCount=sysLogDao.getRowCount(username);
        if(rowCount==0) throw new ServiceException("没有找到对应记录");
        //3.查询当前页记录
        int pageSize=5;
        int startIndex=(pageCurrent-1)*pageSize;
        List<SysLog> records=sysLogDao.findPageObjects(username,startIndex, pageSize);
        //4.封装查询结果并返回
//        PageObject<SysLog> po=new PageObject<>();
//        po.setRowCount(rowCount);
//        po.setRecords(records);
//        po.setPageCurrent(pageCurrent);
//        po.setPageSize(pageSize);
//        int pageCount=rowCount/pageSize;
//        if(rowCount%pageSize!=0)pageCount++;
//        po.setPageCount(pageCount);
//        return po;
          PageObject<SysLog> pageObject= new PageObject<>(rowCount,records,pageCurrent,pageSize);
         // long t2=System.currentTimeMillis();
         // log.info("time {}",t2-t1);
          return pageObject;
    }
}
